#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <cerrno>
#include <fcntl.h>

void SetNonBlock(int fd)
{
	int fl = fcntl(fd,F_GETFL);
	if(fl < 0)
	{
		perror("fcntl");
		return;
	}
	fcntl(fd,F_SETFL,fl | O_NONBLOCK);//O_NONBLOCK:让fd,以非阻塞的方式进行工作
}

int main()
{
	std::string tips = "Please Enter# ";
	char buffer[1024];
	SetNonBlock(0);
	while(true)
	{
		write(0,tips.c_str(),tips.size());
		//非阻塞,如果我们不做输入,数据就不就绪,以出错的形式返回
		//输入不回车,数据也不会被读上来
		//read不是有读取失败吗?失败 vs 底层数据没就绪,不算失败
		//如果返回是-1,失败vs底层我们做法是不同的
		//怎么区分呢?
		//errno表示更详细的出错原因,最近一次调用出错的出错码
		int n = read(0,buffer,sizeof(buffer));
		if(n > 0)
		{
			buffer[n] = 0;
			std::cout << "echo# " << buffer << std::endl;
		}
		else if(n == 0)
		{
			std::cout << "read file end!" << std::endl;
			break;
		}
		else
		{
			// EAGAIN  11 /*Tray again*/
			// EWOULDBLOCK  EAGAIN
			// 两个就是一个
			if(errno == EAGAIN || errno == EWOULDBLOCK)
			{
				//其他事情
				std::cout << "底层数据,没有就绪" << std::endl;
				sleep(1);
				continue;
			}
			else if(errno = EINTR)
			{
				std::cout << "被中断了,重新来" << std::endl;
				continue;
			}
			else
			{
				std::cout << "read error: " << n << "  errno: " << errno  << std::endl;
			}
		}	
	}
}
